package com.wql.trim;

import java.lang.reflect.Field;

/**
 * 对象字符型属性去除空格工具类
 * 
 * @author wuqinglong
 * @time 2013年11月5日 上午10:06:49
 * @email hellowql@126.com
 * 
 */
public class TrimUtils {

	// 私有化构造函数
	private TrimUtils() {
	}

	/**
	 * 去除obj字符属性值的首尾空格和中间的“换行、回车、制表符”
	 * 
	 * @param obj
	 */
	public static void trimObject(Object obj) {
		trimObject(obj, true);
	}

	/**
	 * 去除obj字符属性值的首尾空格
	 * 
	 * @param obj
	 * @param dealCentre
	 *            :是否去除中间的“换行、回车、制表符”
	 */
	public static void trimObject(Object obj, boolean dealCentre) {
		if (null == obj || ignoredObj(obj)) {
			return;
		}
		Class<? extends Object> cls = obj.getClass();
		Field[] fields = cls.getDeclaredFields();
		if (fields.length == 0) {
			return;
		}
		String strClassName = String.class.getName();
		for (Field field : fields) {
			if (!strClassName.equals(field.getType().getName())) {
				continue;
			}
			try {
				field.setAccessible(true);
				field.set(obj, trim((String) field.get(obj), dealCentre));
			} catch (IllegalArgumentException e) {

			} catch (IllegalAccessException e) {
			} catch (SecurityException e) {
			}
		}
	}

	/**
	 * 去除字符首尾和中间的“换行、回车、制表符”
	 * 
	 * @param str
	 * @return
	 */
	public static String trim(String str) {
		return trim(str, true);
	}

	/**
	 * 去除字符首尾空格（p{Z}：UnicodeProperty正则表示法，表示任意的空白字符或不可见的分隔符）
	 * 
	 * @param str
	 * @param dealCentre
	 * @return
	 */
	public static String trim(String str, boolean dealCentre) {
		if (null == str) {
			return str;
		}
		return dealCentre ? str.replaceAll("^\\p{Z}+", "").replaceAll("\\p{Z}+$", "").replaceAll("[\r\t\n]+", "") : str
				.replaceAll("^\\p{Z}+", "").replaceAll("\\p{Z}+$", "");
	}

	/**
	 * 不需要过滤的对象
	 * 
	 * @param obj
	 * @return
	 */
	private static boolean ignoredObj(Object obj) {
		Class<? extends Object> cls = obj.getClass();
		return cls.isPrimitive() || cls.isInterface() || cls.isArray() || cls.getName().startsWith("java.")
				|| cls.getName().startsWith("javax.");
	}

}
